PINE A64でI2CとGPIOを使ってみた
こんにちは。CX事業本部IoT事業部のakkyです。今回は、PINE A64でI2CとGPIOを使う方法をご紹介します。
実験環境
- SBC: PINE A64 (RAM 1GB版)
- OS: Armbian 22.05.0-trunk.0005 with Linux 5.15.26-sunxi64
- I2Cディスプレイ: AE-AQM0802+PCA9515
OSの設定(armbian-config)
I2CとGPIOを使用する前に、armbian-configでハードウェアを有効にする必要があります。
$ sudo armbian-config
を実行し、System→Hardwareからi2c1とpps-gpioを有効にする(スペースキーで有効・無効の切り替え)を行い、再起動します。
一般ユーザがI2Cを利用できるようにするには、以下のコマンドで対象ユーザをi2cグループに追加する必要があります(sudoを使用する場合は不要です)。設定後再起動してください。
$ sudo adduser akky i2c
同様に、一般ユーザがGPIOを利用できるようにするには、以下のコマンドを実行します。
$ sudo chmod o+wr /dev/gpiochip*
I2Cの使用方法
Raspberry Pi用のコマンドやライブラリがそのまま使用できました。
実験として、秋月電子で販売されているRaspberry Pi用のI2Cキャラクタ液晶AE-AQM0802+PCA9515を使用しました。キャラクタ液晶をPI-2 ConnectorのRaspberry Piと同じ位置に差し込みます。
i2cdetectコマンドで接続を確認します。3eがデバイスのアドレスです。
$ /sbin/i2cdetect 1 WARNING! This program can confuse your I2C bus, cause data loss and worse! I will probe file /dev/i2c-1. I will probe address range 0x08-0x77. Continue? [Y/n] y 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 3e -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
その後、Pythonでpipでlcd-st7032をインストールした後、サンプルを参考に以下のコードを実行すると、きちんと文字列が表示されることが確認できました。
from lcd_st7032 import ST7032 lcd = ST7032() lcd.write("Hello ") lcd.setCursor(1,0) lcd.write(" World")
また、bashを使った実装であるTakeru-chan/bash-de-aqm0802も同様に動作することを確認できました。
GPIOの使用方法
バックライトも制御したいので、GPIOの操作も試してみます。
過去の資料では/sys/class/gpioを使用する方法が紹介されていますが、Kernel 4.8以降この方法は非推奨となり、現在はlibgpiodを使用します。 GPIO操作には、以下のURLに記載されているコマンドを使用します。 https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git/tree/README
これらのコマンドに指定する番号とGPIO名との対応は、/sys/kernel/debug/pinctrl/*/pinsに記載されています。
具体的には、以下の3種類のGPIOデバイスがあります。
- 1c20800.pinctrl
- 1f02c00.pinctrl
- axp20x-gpio
それぞれ確認すると、1c20800.pinctrlはPB、PC、PD、PE、PF、PG、PHのポート、1f02c00.pinctrlはPLであることがわかります。Raspberry PiのGPIO04に対応するのはPL10ですから、1f02c00.pinctrlの10番を制御します。
1f02c00.pinctrlがgpiochip0~2のどれに対応すればよいかは実際に試してみるしかないのですが、gpiochip0であることがわかりました。以下のコマンドを実行すると、バックライトを制御できました。
$ gpioset gpiochip0 10=0 #LOWにする(消灯) $ gpioset gpiochip0 10=1 #HIGHにする(点灯)